#coding=utf-8
from socket import *
import time

#用来存储所有的新连接的socket,这个是重点
g_socketList = []

def main():
	serSocket = socket(AF_INET, SOCK_STREAM)
	serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1)
	localAddr = ('', 7788)
	serSocket.bind(localAddr)
	#这里可以适当修改listen的值来看看不同的现象
	serSocket.listen(1000)
	#.将套接字设置为非堵塞
	#.这个非常重要，设置为非堵塞后，如果accept时，没有客户端连接，那么会产生一个异常，
	#.所以我们用try来处理这个函数
	serSocket.setblocking(False)
	
	while True:
		try:
			newClientInfo = serSocket.accept()
		except Exception as result:
			pass
		else:
			print("..新客户端连接了.:%s"%str(newClientInfo))
			#这里依旧设置为非堵塞
			newClientInfo[0].setblocking(False)
			#这里重点加入列表
			g_socketList.append(newClientInfo)
			
		# 来存储需要删除的客户端信息
		needDelClientInfoList = []
		
		#这里循环读取socket列表，逐一去请求是否有客户端连接，这是select版本的简化版
		#但是是理解select版本的核心
		for clientSocket,clientAddr in g_socketList:
			try:
				recvData = clientSocket.recv(1024)
				if len(recvData)>0:
					print('recv[%s]:%s'%(str(clientAddr), recvData))
				else:
					print('[%s]客户端已经关闭'%str(clientAddr))
					clientSocket.close()
					g_needDelClientInfoList.append((clientSocket,clientAddr))
			except Exception as result:
				pass
		
		for needDelClientInfo in needDelClientInfoList:
			g_socketList.remove(needDelClientInfo)
			
if __name__ == '__main__':
	main()